
#include "../include/Acceptor.h"
#include "../include/my_header.h"

namespace wd
{

Acceptor::Acceptor(unsigned short port, const string & ip)
: _addr(port, ip) 
, _sock()
{}

void Acceptor::ready()
{
    setReuseAddr(true);
    setReusePort(true);
    bind();
    listen();
}

int Acceptor::accept()
{
    int netfd = ::accept(_sock.fd(), nullptr, nullptr);
    if(netfd < 0) {
        perror("accept");
    }
    return netfd;
}

void Acceptor::setReuseAddr(bool on)
{
    int one = on;
    int ret = setsockopt(_sock.fd(),
                         SOL_SOCKET,
                         SO_REUSEADDR,
                         &one,
                         sizeof(one));
    if(ret < 0) {
        perror("setsockopt");
    }
}

void Acceptor::setReusePort(bool on)
{
    int one = on;
    int ret = setsockopt(_sock.fd(),
                         SOL_SOCKET,
                         SO_REUSEPORT,
                         &one,
                         sizeof(one));
    if(ret < 0) {
        perror("setsockopt");
    }
}

void Acceptor::bind()
{
    int ret = ::bind(_sock.fd(), (const struct sockaddr*)
                     _addr.getInetAddressPtr(), 
                     sizeof(_addr));
    if(ret < 0) {
        perror("bind");
    }
}

void Acceptor::listen()
{
    int ret = ::listen(_sock.fd(), 20000);
    if(ret < 0) {
        perror("listen");
    }
}

}//end of namespace wd
